package com.zhledu.hadoop;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;

/***
 * 作业要求
 * 1、使用java连接上hadoop文件系统
 * 2、在hadoop文件系统上建立一个/user/序号的文件夹【注：学号为自己的学号】
 * 3、在/user/序号文件夹下面创建一个空的文件取名"学号.txt"
 * 4、在上述文件中追加内容，内容为“学号  姓名”
 * 5、重复【3-4】步，将本小组的其他成员的信息按照3-4步的要求建立文件和内容
 * 6、将建立好的几个文件合并到一个文件中，原来的文件不能删除，文件名称为g0数字.txt【注：数字为自己的组号】
 * 7、将g0数字.txt重命名为“g0数字学生信息.txt”
 * 8、打印出g0数字学生信息.txt的内容
 * 9、将g0数字学生信息.txt文件下载到本地
 * 10、关闭hadoop文件系统连接
 */
public class HadoopHomeWork {
    public static void main(String[] args) {
        //1、使用java连接上hadoop文件系统
        Configuration conf = new Configuration();
        FileSystem fs = null;
        try {
            System.out.println("开始连接hdfs://zhli2008.gicp.net:9000........");
            fs =FileSystem.get(new URI("hdfs://zhli2008.gicp.net:9000"), conf, "root");
        } catch (Exception e) {
            System.out.println("zhli2008.gicp.net:9000无法连接");
            System.exit(1);
        }
        System.out.println("已经连接上hdfs://zhli2008.gicp.net:9000");

        //2、在hadoop文件系统上建立一个/user/序号的文件夹【注：学号为自己的学号】
        Path path = new Path("/user/12006242601");
        try {
            if (fs.exists(path)) {
                fs.delete(path, true);
                System.out.println("文件夹存在，删除成功");
            }
        } catch (IOException e) {
            System.out.println("文件系统中存在/user/12006242601的文件夹，并且删除失败，系统退出");
            System.exit(1);
        }
        try {
            fs.mkdirs(path);
            System.out.println("创建文件夹成功");
        } catch (IOException e) {
            System.out.println("创建文件夹/user/12006242601失败，系统退出");
            System.exit(1);
        }

        //3、在/user/序号文件夹下面创建一个空的文件取名"学号.txt"
        try {
            fs.createNewFile(new Path("/user/12006242601/12006242601.txt"));
            fs.createNewFile(new Path("/user/12006242601/12006242602.txt"));
            fs.createNewFile(new Path("/user/12006242601/12006242603.txt"));
            fs.createNewFile(new Path("/user/12006242601/12006242604.txt"));
            System.out.println("创建文件成功");
        } catch (IOException e) {
            System.out.println("创建文件/user/12006242601/12006242601.txt失败，系统退出");
            System.exit(1);
        }

        //4、在上述文件中追加内容，内容为“学号  姓名”
        // 5、重复【3-4】步，将本小组的其他成员的信息按照3-4步的要求建立文件和内容
        try {
            FSDataOutputStream os = fs.append(new Path("/user/12006242601/12006242601.txt"));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write("12006242601\t张亮\n");
            writer.close();
            os.close();


            os = fs.append(new Path("/user/12006242601/12006242602.txt"));
            writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write("12006242602\t于洋\n");
            writer.close();
            os.close();

            os = fs.append(new Path("/user/12006242601/12006242603.txt"));
            writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write("12006242603\t烛龙\n");
            writer.close();
            os.close();

            os = fs.append(new Path("/user/12006242601/12006242604.txt"));
            writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write("12006242604\t液晶\n");
            writer.close();
            os.close();

            System.out.println("向文件中追加内容成功");
        } catch (IOException e) {
            System.out.println("追加内容失败，系统退出:" + e.getMessage());
            e.printStackTrace();
            System.exit(1);
        }
        //6、将建立好的几个文件合并到一个文件中，原来的文件不能删除，文件名称为g0数字.txt【注：数字为自己的组号】
        try {
            Path[] srcs = {new Path("/user/12006242601/12006242601.txt"), new Path("/user/12006242601/12006242602.txt"), new Path("/user/12006242601/12006242603.txt"), new Path("/user/12006242601/12006242604.txt")};
            Path dest = new Path("/user/12006242601/g01.txt");
            if (fs.exists(dest)) {
                fs.delete(dest, true);
                System.out.println("/user/12006242601/g01.txt存在，删除成功");
            }
            fs.createNewFile(dest);
            FSDataOutputStream os = fs.append(dest);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
            for (Path src : srcs) {
                FSDataInputStream is = fs.open(src);
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    writer.write(line);
                    writer.newLine();
                }
                is.close();
            }
            writer.close();
            os.close();

        } catch (IOException ex) {
            ex.printStackTrace();
            System.exit(1);
        }

        //7、将g0数字.txt重命名为“g0数字学生信息.txt”
        try {
            fs.rename(new Path("/user/12006242601/g01.txt"), new Path("/user/12006242601/g01学生信息.txt"));
        } catch (IOException exc) {
            System.out.println("重命名失败：" + exc.getMessage());
            System.exit(1);
        }

        //8、打印出g0数字学生信息.txt的内容
        try {
            FSDataInputStream is = fs.open(new Path("/user/12006242601/g01学生信息.txt"));
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            is.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            System.exit(1);
        }

        //9、将g0数字学生信息.txt文件下载到本地
        try {
            File file = new File("d:\\g01学生信息.txt");
            if (file.exists()) {
                file.delete();
            }
            fs.copyToLocalFile(false, new Path("/user/12006242601/g01学生信息.txt"), new Path("d:\\g01学生信息.txt"), true);
            System.out.println("文件下载成功");
        } catch (IOException ex) {
            System.out.println("下载文件失败：" + ex.getMessage());
            ex.printStackTrace();
            System.exit(1);
        }

        //10、关闭hadoop文件系统
        try {
            fs.close();
            System.out.println("zhli2008.gicp.net:9000");
        } catch (IOException ex) {
            ex.printStackTrace();
            System.exit(1);
        }
    }

}
